package com.kangye.learnstudent.service.impl;

import com.kangye.learnstudent.entity.User;
import com.kangye.learnstudent.mapper.UserMapper;
import com.kangye.learnstudent.service.UserService;
import com.kangye.learnstudent.util.PhoneMessageUtil;
import com.kangye.learnstudent.util.RedisStorageUtil;
import com.kangye.learnstudent.util.UploadFileUtil;
import com.kangye.learnstudent.util.ViewJsonObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @program: learndeduo
 * @description: 实现用户逻辑接口
 * @author: 索腾龙
 * @create: 2021-05-17 11:08
 **/
@Service
@Transactional
public class UserServiceImpl implements UserService {
    //注入mapper数据接口
    @Autowired
    private UserMapper userMapper;

    //注入redis工具类
    @Autowired
    private RedisStorageUtil redisStorageUtil;

    /*学生登录逻辑接口实现*/
    @Override
    public ViewJsonObject<User> userLogin(String userUserName, String userPassword) {
        //进行账号密码的验证操作
        if(userUserName.equals("")||userUserName == null || userPassword.equals("")|| userPassword == null){
            //返回错误值
            return new ViewJsonObject(1,"账号或密码错误");
        }

        //从redis中获取数据
//        User redisUser = (User) redisStorageUtil.getKeyOne("studentUserRedisData"+userUserName);
        User redisUser = (User) redisStorageUtil.getKeyOne("studentUserRedisData");
        System.out.println(redisUser);
        //判断是否有数据
        if (redisUser != null){
            //判断输入的账号密码和缓存中的账号密码是否相同
            if(userUserName.equals(redisUser.getUserUserName()) && userPassword.equals(redisUser.getUserPassword())){
                //将数据返回
                return new ViewJsonObject(0,"登录成功");
            }
        }

        //调用mapper查询数据
        User user = userMapper.userLogin(userUserName, userPassword);
        //判断list集合的长度大于0

        //判断对象不为null
        if (user != null){
            //将数据存储到redis中 失效时间为30分钟
            redisStorageUtil.addObjOne("studentUserRedisData"+userUserName,user,30, TimeUnit.MINUTES);
            //将数据返回
            return new ViewJsonObject(0,"登录成功");
        }

        //返回错误值
        return new ViewJsonObject(1,"账号或密码错误");
    }

    /**
     * 判断用户绑定的手机号,及给手机号发送短信
     * @param userUserName
     * @return 返回json的成功或失败的数据
     */
    @Override
    public ViewJsonObject<User> userPhoneMsg(String userUserName,String userPhone) {
        //判断传递过来的数据是否为空值
        if (userUserName.equals("") || userUserName == null){
            return new ViewJsonObject(1,"该用户名不存在");
        }else if (userPhone.equals("") || userPhone == null){
            return new ViewJsonObject(2,"请输入手机号");
        }
        //总数据库中查询
        User user = userMapper.userByUserName(userUserName);
        //判断值是否为空
        if (user == null){
            return new ViewJsonObject(1,"该用户名不存在");
        }else if (!userPhone.equals(user.getUserPhone())){
            //从查询的数据中,对比传进来的手机号查看是否一致
            return new ViewJsonObject(3,"请输入该用户绑定的手机号");
        }
        //先去redis中去查看有没有缓存
        String status = (String) redisStorageUtil.getKeyOne(userPhone);
        if (status != null){
            //向页面返回数据
            return new ViewJsonObject(4,"您已接收过验证码,请于五分钟之后再次发送");
        }

        //发送手机验证码
        String phoneCode = PhoneMessageUtil.message(userPhone);
        //将手机验证码放入到redis中
        redisStorageUtil.addObjOne(userPhone,phoneCode,5,TimeUnit.MINUTES);
        //向页面返回数据
        return new ViewJsonObject(0,"请注意查收验证码,5分钟以内进行修改");
    }

    /**
     *
     * @param userUserName 用户名
     * @param userPassword 密码
     * @param userPhone 手机号
     * @param code 验证码
     * @return
     */
    @Override
    public ViewJsonObject<User> passwordReset(String userUserName, String userPassword,String userPhone, String code) {
        //判空值操作
        if(userUserName.equals("")||userUserName == null || userPassword.equals("")|| userPassword == null
                || userPhone.equals("") || userPhone == null || code.equals("")|| code == null){
            //返回错误值
            return new ViewJsonObject(1,"请填写必要的数据");
        }
        //从redis中获取验证码
        String phoneCode = (String) redisStorageUtil.getKeyOne(userPhone);
        //对比输入的验证码
        if (phoneCode != null){
            if (code.equals(phoneCode)){
                //调用修改数据的方法
                Integer integer = userMapper.userByUserNameUpdPassword(userUserName, userPassword);
                //判断返回的影响行数,大于0则说明成功
                return integer > 0 ? new ViewJsonObject(0,"修改成功") : new ViewJsonObject(2,"修改失败");
            }
            return new ViewJsonObject(3,"请输入正确的验证码");
        }
        return new ViewJsonObject(4,"请先获取验证码");
    }

    /**
     * 上传图片的接口
     * @return
     */
    @Override
    public ViewJsonObject imgUpload(MultipartFile... file) throws IOException {
        String imgName = UploadFileUtil.uploadFilePro("filePath.properties", file);
        //将图片的名字放入到redis中
        redisStorageUtil.addObjOne("imgName",imgName,10,TimeUnit.MINUTES);
        return new ViewJsonObject(0,"上传成功");
    }

    /**
     * 注册用户时,手机发送短信
     * @param userPhone
     * @return
     */
    @Override
    public ViewJsonObject<User> userPhoneMsg(String userPhone) {
        //先去redis中去查看有没有缓存
        String status = (String) redisStorageUtil.getKeyOne("register"+userPhone);
        if (status != null){
            //向页面返回数据
            return new ViewJsonObject(1,"您已接收过验证码,请于五分钟之后再次发送");
        }else {
            //发送手机验证码
            String phoneCode = PhoneMessageUtil.registerMessage(userPhone);
            //将手机验证码放入到redis中
            redisStorageUtil.addObjOne("register" + userPhone, phoneCode, 5, TimeUnit.MINUTES);
            //向页面返回数据
            return new ViewJsonObject(0, "请注意查收验证码,5分钟以内进行注册");
        }
    }

    /**
     * 注册用户
     * @param user 传入的用户信息
     * @param code 验证码
     * @return
     */
    @Override
    public ViewJsonObject<User> registerUser(User user, String code) {
        //从redis中获取验证码
        String redisCode = (String) redisStorageUtil.getKeyOne("register"+user.getUserPhone());
        //对比验证码
        if (redisCode == null){
            return new ViewJsonObject<>(1,"请先获取手机验证码");
        }else if (!code.equals(redisCode)){
            return new ViewJsonObject<>(2,"验证码输入有误");
        }
        //从reds中获取上传的图片名字
        String imgName = (String) redisStorageUtil.getKeyOne("imgName");
        //添加图片
        user.setUserHeadLogo(imgName);
        //添加角色--固定的
        user.setUserRoleId(3);
        //添加创建时间
        user.setUserCreateTime(new Timestamp(new java.util.Date().getTime()));
        //调用数据层进行添加
        Integer integer = userMapper.registerUser(user);
        //返回的影响行数大于0则说明添加成功
        if(integer > 0){
            return new ViewJsonObject<>(0,"添加成功");
        }else{
            return new ViewJsonObject<>(3,"添加失败,请稍后重试");
        }
    }

    /**
     * 根据用户名查询
     * @param userUserName
     * @return
     */
    @Override
    public ViewJsonObject<User> userByUserName(String userUserName) {
        //查询用户名
        User user = userMapper.userByUserName(userUserName);
        if(user == null){
            return new ViewJsonObject<>(0,"用户名可以使用");
        }else{
            return new ViewJsonObject<>(1,"用户名重复");
        }

    }
    /*
    * 用户个人信息展示
    * */
    @Override
    public ViewJsonObject<User> userSelect(Integer userId) {
        //用实体类接收方法
        User user = userMapper.userSelect(userId);
        System.out.println(user);
        //创建List对象
        List<User> list = new ArrayList<>();
        //把user添加到list集合里
        list.add(user);
        //json格式返回数据
        return new ViewJsonObject<>(list);
    }
    /*
    用户根据id修改自己的信息
    * */
    @Override
    public Integer userUpdata(User user) {

      return this.userMapper.userUpdata(user);
    }

}